package com.zjp.transaction;

import cn.hutool.core.date.DateUtil;
import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;

public class TransactionListenerImpl implements TransactionListener {
    // 执行本地事务
    @Override
    public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        // 执行本地事务 update A...
        System.out.println("update A ... where transactionId:" + msg.getTransactionId());
        // 情况1：本地事务成功
        System.out.println("commit:"+msg.getTransactionId());
        System.out.println("执行本地事务成功，确认消息");
        return LocalTransactionState.COMMIT_MESSAGE;

        // 情况2：本地事务失败
//        System.out.println("rollback:"+msg.getTransactionId());
//        System.out.println("执行本地事务失败，删除消息");
//        return LocalTransactionState.ROLLBACK_MESSAGE;

        // 情况3：业务复杂，还处于中间过程或者依赖其他操作的返回结果，就是unknow
/*        System.out.println("业务比较长，还没有处理完，不知道是成功还是失败！");
        return LocalTransactionState.UNKNOW;*/
    }

    @Override
    public LocalTransactionState checkLocalTransaction(MessageExt msg) {
        //打印每次回查的时间
        System.out.println("checkLocalTransaction:" + DateUtil.now());// new Date()为获取当前系统时间
        // 情况3.1：业务回查成功！
//        System.out.println("业务回查：执行本地事务成功，确认消息");
//        return LocalTransactionState.COMMIT_MESSAGE;
        // 情况3.2：业务回查回滚！
//        System.out.println("业务回查：执行本地事务失败，删除消息");
//        return LocalTransactionState.ROLLBACK_MESSAGE;
        // 情况3.3：业务回查还是UNKNOW！
        System.out.println("业务比较长，还没有处理完，不知道是成功还是失败！");
        return LocalTransactionState.UNKNOW;
    }
}
